import axios from 'axios'
import { Message } from 'element-ui'
import store from '@/store'
import { getTimeStamp } from './auth'
import router from '@/router'
// 定义时间差
const Timeout = 3600
const service = axios.create({
   // 两种可能：开发环境：npm run dev --> /dev-api
   // 生产环境 ：npm run build --> /prod - api
   // 我们设置的反向代理为 /api
   // 所以把 env.development 的开发环境地址改为 /api
   // 另一个为生产环境不用改
   baseURL: process.env.VUE_APP_BASE_API,
   // 超时时间
   timeout: 5000
})
// 请求拦截器
service.interceptors.request.use(
   config => {
      // config 是请求的配置信息
      // 注入token
      // 判断下有没有 token
      if (store.getters.token) {
         if (tokenTimeOut()) {
            store.dispatch('user/logout')
            router.push('/login')
            // 返回一个信息
            return Promise.reject(new Error('token超时了'))
         }
         config.headers[
            'Authorization'
         ] = `Bearer ${store.getters.token}`
      }
      // 注意：必须要返回的
      return config
   },
   error => {
      return Promise.reject(error)
   }
)
// 响应拦截器
service.interceptors.response.use(
   response => {
      // axios默认加了一层data
      const { success, message, data } = response.data
      // 要根据 success 的成功与否决定下面的操作
      if (success) {
         return data
      } else {
         // 提示错误消息
         // 当错了， 不能进 then ，应该进 catch
         Message.error(message)
         // 并没有发现有错误对象，人为的实例化一个错误对象
         return Promise.reject(new Error(message))
      }
   },
   error => {
      if (
         error.response &&
         error.response.data &&
         error.response.data.code === 10002
      ) {
         // 当等于 10002 的时候，表示后端告诉我 token 超时
         // 先删除token，再退出登录
         store.dispatch('user/logout')
         router.push('/login')
      } else {
         // 提示错误信息
         Message.error(error.message)
      }
      // 返回执行错误，让当前的执行链跳出成功，直接进入catch
      return Promise.reject(error)
      // login().then().catch()
   }
)
// 定义判断 token 超时的函数
// 逻辑: 当前的时间 - 存取 token 的时间，是否大于设置的时间差
function tokenTimeOut() {
   // 当前时间
   var currentTime = Date.now()
   // 获取 token 存入的时间
   var timestamp = getTimeStamp()
   return (currentTime - timestamp) / 1000 > Timeout
}

export default service
